package Q591;

import java.util.Stack;

public class Main2 {
    public static void main(String[] args) {

    }
}

class Solution {
    public boolean isValid(String code) {
        Stack<String> TAG_NAME=new Stack<>();
        int length=code.length();
        if(length<=6)   return false;
        int start=0;
        if(code.charAt(start)!='<') return false;
        while(start<length){
            if(code.charAt(start)=='<'){
                //System.out.println();
                if(start==length-1)
                    return false;
                if(code.charAt(start+1)=='!'){
                    //cdata
                    if(TAG_NAME.size()==0)
                        return false;
                    if(start+9<=length){
                        String cdatastart=code.substring(start,start+9);
                        if(!cdatastart.equals("<![CDATA["))
                            return false;
                        //System.out.println("meet cdatastart:"+cdatastart);
                        start+=9;
                        if(start==length)   return false;
                        while(start<length){
                            if(code.charAt(start)!=']'){
                                start++;
                            }
                            else{
                                if(start+3<=length){
                                    String cdataend=code.substring(start,start+3);
                                    if(cdataend.equals("]]>")){
                                        //System.out.println("meet cdataend:"+cdataend);
                                        start+=3;
                                        break;
                                    }
                                    else
                                        start++;

                                }
                                else{
                                    return false;
                                }
                            }
                        }
                    }
                    else
                        return false;
                }
                else if(code.charAt(start+1)>='A'&&code.charAt(start+1)<='Z'){
                    //starttag
                    start++;
                    int end=start;
                    while(end<length&&code.charAt(end)>='A'&&code.charAt(end)<='Z')
                        end++;
                    if(end==length)
                        return false;
                    if(code.charAt(end)=='>'){
                        String tempstr=code.substring(start,end);
                        if(tempstr.length()>9||tempstr.length()<1)
                            return false;
                        //System.out.println("start tag:"+tempstr);
                        TAG_NAME.push(tempstr);
                        start=end+1;
                    }
                    else if(code.charAt(end)<='A'&&code.charAt(end)>='Z')
                        return false;
                }
                else if(code.charAt(start+1)=='/'){
                    //endtag
                    if(TAG_NAME.size()==0)
                        return false;
                    start+=2;
                    int end=start;
                    while(end<length&&code.charAt(end)>='A'&&code.charAt(end)<='Z')
                        end++;
                    if(end==length)
                        return false;
                    if(code.charAt(end)=='>'){
                        String tempstr=code.substring(start,end);
                        //System.out.println("endtag:"+tempstr);
                        String tagstart=TAG_NAME.pop();
                        if(!tagstart.equals(tempstr))
                            return false;
                        else{
                            if(end!=length-1&&TAG_NAME.size()==0)
                                return false;
                            start=end+1;
                        }
                    }
                    else if(code.charAt(end)<='A'&&code.charAt(end)>='Z')
                        return false;
                }
                else
                    return false;
            }
            else{
                //System.out.print(code.charAt(start))
                start++;
            }
        }
        if(TAG_NAME.size()>0||start<length)
            return false;
        return true;
    }
}
